/**
 * 高德地图API服务
 */

// 高德地图API密钥
const AMAP_KEY = '7f7a58932a276710392d574317aacdf4' // 实际使用时需要替换为真实的API密钥

/**
 * 逆地理编码接口响应数据接口
 */
interface ReGeoResponse {
  status: string
  info: string
  regeocode: {
    formatted_address: string
    addressComponent: {
      province: string
      city: string
      district: string
      township: string
      adcode: string
    }
  }
}

/**
 * 逆地理编码，将经纬度转换为地址信息
 * @param longitude 经度
 * @param latitude 纬度
 * @returns 地址信息
 */
export async function reverseGeocode(
  longitude: number,
  latitude: number,
): Promise<{
  province: string
  city: string
  district: string
  township: string
  adcode: string
  formatted_address: string
}> {
  try {
    // 构建请求URL
    const url = `https://restapi.amap.com/v3/geocode/regeo?key=${AMAP_KEY}&location=${longitude},${latitude}&extensions=base&output=json`

    // 发送请求
    const response = await fetch(url)
    const data = (await response.json()) as ReGeoResponse

    // 检查响应状态
    if (data.status !== '1') {
      throw new Error(`高德地图API请求失败: ${data.info}`)
    }

    // 提取地址信息
    const { province, city, district, township, adcode } = data.regeocode.addressComponent
    const formatted_address = data.regeocode.formatted_address

    return {
      province,
      city,
      district,
      township,
      adcode,
      formatted_address,
    }
  } catch (error) {
    console.error('逆地理编码失败:', error)

    // 返回默认值（巴中市的行政区划）
    return {
      province: '四川省',
      city: '巴中市',
      district: '巴州区',
      township: '',
      adcode: '511902',
      formatted_address: '四川省巴中市巴州区',
    }
  }
}

/**
 * 模拟逆地理编码，用于开发测试
 * 根据经纬度范围返回不同的行政区
 * @param longitude 经度
 * @param latitude 纬度
 * @returns 地址信息
 */
export function mockReverseGeocode(
  longitude: number,
  latitude: number,
): {
  province: string
  city: string
  district: string
  township: string
  adcode: string
  formatted_address: string
} {
  // 巴中市下辖区县及其大致经纬度范围
  // 注意：这些范围是模拟的，不代表真实的行政区划边界
  const districts = [
    {
      name: '巴州区',
      adcode: '511902',
      // 巴州区在中部偏东
      lonRange: [106.7, 106.9],
      latRange: [31.8, 32.0],
    },
    {
      name: '恩阳区',
      adcode: '511903',
      // 恩阳区在东部
      lonRange: [106.9, 107.1],
      latRange: [31.7, 31.9],
    },
    {
      name: '通江县',
      adcode: '511921',
      // 通江县在北部
      lonRange: [106.6, 106.8],
      latRange: [32.0, 32.2],
    },
    {
      name: '南江县',
      adcode: '511922',
      // 南江县在西部
      lonRange: [106.4, 106.6],
      latRange: [31.8, 32.0],
    },
    {
      name: '平昌县',
      adcode: '511923',
      // 平昌县在南部
      lonRange: [106.6, 106.8],
      latRange: [31.6, 31.8],
    },
  ]

  // 根据经纬度范围确定区县
  let district = null

  // 首先尝试精确匹配经纬度范围
  for (const d of districts) {
    if (
      longitude >= d.lonRange[0] &&
      longitude <= d.lonRange[1] &&
      latitude >= d.latRange[0] &&
      latitude <= d.latRange[1]
    ) {
      district = d
      break
    }
  }

  // 如果没有精确匹配，使用最近距离匹配
  if (!district) {
    let minDistance = Number.MAX_VALUE

    for (const d of districts) {
      // 计算点到区域中心的距离
      const centerLon = (d.lonRange[0] + d.lonRange[1]) / 2
      const centerLat = (d.latRange[0] + d.latRange[1]) / 2

      const distance = Math.sqrt(
        Math.pow(longitude - centerLon, 2) + Math.pow(latitude - centerLat, 2),
      )

      if (distance < minDistance) {
        minDistance = distance
        district = d
      }
    }
  }

  // 如果仍然没有匹配到，使用随机分配
  if (!district) {
    const randomIndex = Math.floor(Math.random() * districts.length)
    district = districts[randomIndex]
  }

  return {
    province: '四川省',
    city: '巴中市',
    district: district.name,
    township: '',
    adcode: district.adcode,
    formatted_address: `四川省巴中市${district.name}`,
  }
}
